package com.zjj.learn.designmodel.work.bridge;

public class BridgeTest {

    public static void main(String[] args) {

//        Mac mac = new Mac(new MusicFileParser());
//        mac.parseFile();

        Windows windows = new Windows(new VideoFileParser(),new MusicFileParser());
        windows.parseFile();

    }

    /**
     * 桥接模式：结构型模式
     *     桥接模式就是将抽象部分和实际部分用一个桥接过渡起来，即将继承关系变为关联关系，从而使得两部分可以扩展而互不影响。
     *     在实现桥接模式时，有两个重要的概念：抽象部分和实现部分。
     *     抽象部分定义了系统中所需功能的通用接口，而实现部分则负责提供这些接口的具体实现。这两个部分之间通过桥接连接器进行交互。
     *
     *     在桥接模式中，系统必须包含一个抽象类或接口，它定义了所有实施具体功能所需的方法。
     *     这个抽象基类与实现它的所有子类之间都应该存在一个桥接连接器。
     *     这个桥接连接器就是一个抽象类或接口，它声明了所有该特性所需的方法，但并不提供任何默认实现。
     * 案例举例说明：
     *     电脑有文件解析功能，有不用的操作系统，有很多不同类型的文件，假设使用传统的继承模式就是这样的
     *     Computer 电脑作为一个类
     *        Computer有 Mac，Linux，Windows 等等具体的实现类。
     *        假设有一个视频文件解析 VideoFile ，当 三个操作系统都有这种视频解析功能时，那么就是有三个操作系统视频解析类
     *              MacVideoFile，LinuxVideoFile 和 WindowsVideoFile
     *        假设又出现了音频解析器 MusicFile，并且三个操作系统也都有这个功能，那么就又有三个操作系统音频解析类
     *              MacMusicFile，LinuxMusicFile 和 WindowsMusicFile
     *        那么如果有出现了三个操作系统并且有 VideoFile 和 MusicFile 解析功能时，又该怎么办呢？难道又创建各种类？
     *        这样就可以看出来了，传统的继承模式很容易出现 类爆炸 的情况，所以这样是不可取的。
     *
     * 使用桥接模式处理这个问题：
     *      定义一个操作系统类：OperateSystem，我们将 文件解析器【FileParser】作为 OperateSystem 的成员（聚合关系）
     *        咱们将在创建操作系统时，将 FileParser 作为参数传递给 OperateSystem 的构造器，这样子就可以很轻松的创建出有各个功能的操作系统了。
     *         具体情况见
     *      FileParser 只是一个抽象类或者接口，在给 OperateSystem 传递参数是应该是 FileParser 的子类或者实现类
     *      有很多种不同的操作系统，直接继承自 OperateSystem 即可
     *      具体实现请见：{@link com.zjj.learn.designmodel.work.bridge}
     *      核心类请见：{@link com.zjj.learn.designmodel.work.bridge.OperateSystem}
     *               在这里可供了一次性可以传递多个文件解析器，如下
     *                Windows windows = new Windows(new VideoFileParser(),new MusicFileParser());
     *
     *  桥接模式的特征：
     *
     **/
}
